package com.zhouheng.springbootdesignpattern.observerpattern;

import java.util.Vector;

/**
 * 被观察者 - 抽象类
 *
 * @author 周恒
 * @date 20190401 16:50:54
 * @since v1.0
 */
public abstract class Subject {

    /**
     * vectors Vector是同步访问的所有“观察者”
     */
    private final Vector<Observer> vectors = new Vector();

    protected void add(Observer observer){
        vectors.add(observer);
    }

    protected void remove(Observer observer){
        vectors.remove(observer);
    }

    /**
     * 通知所有观察者
     * 每个观察者实现不同的update功能
     *
     * 通知到每个观察者，循环，性能堪忧，而且容易异常提前退出
     * 异常可以加try catch，性能没办法了
     *
     * @author 周恒
     * @date 20190401 16:50:27
     * @since v1.0
     */
    protected void notifyObserver(){
        vectors.forEach(observer -> observer.update());
    }

    /**
     * 被观察事件
     *
     * @author 周恒
     * @date 20190401 16:50:42
     * @since v1.0
     */
    protected abstract void doSomething();

}
